package com.mybatis;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

/**
 * 1、根据xml配置文件（全局配置文件）创建一个SqlSessionFactory对象，有数据源一些运行环境信息
 * 2、sql映射文件；配置了每一个sql，以及sql的封装规则等
 * 3、将sql映射文件注册在全局配置中
 * 4、写代码：
 *      1）根据全局配置文件得到sqlSessionFactory
 *      2）使用sqlSessionFactory工厂，获取到sqlSession对象使用它来执行CRUD，一个sqlSession就是代表和数据库的一次会话，用完关闭
 *      3）使用sql的唯一标志来告诉mybatis执行哪个sql。sql都是保存在sql映射文件中的
 * (接口式编程)
 *
 * 1.sqlSession代表和数据库一次会话；用完关闭
 * 2.sqlSession和connection一样是非线程安全的，所以不能以共享使用
 * 3.mapper接口没有实现类，但是mybatis会为这个接口生成一个实现类
 *      EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); 获取一个代理对象
 * 4.两个重要配置文件:
 *      mybatis的全局配置文件：连接池信息、数据库信息、事务管理器等、、系统运行信息
 *      sql映射文件：保存每一个sql语句的映射信息
 *                     将sql映射出来
 *
 */
public class App 
{
    public static void main(String... args) throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //2.获取sqlSession实例，能直接执行已经映射的sql语句
        //SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);//5747ms
        SqlSession sqlSession = sqlSessionFactory.openSession();//108456ms

        try{
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            //queryPage(mapper);
            //批量插入
            insertBatch(mapper);
            sqlSession.commit();
        }finally {
            sqlSession.close();
        }
    }

    private static void queryPage(EmployeeMapper mapper) {
        Page<Object> page = PageHelper.startPage(1, 5);
        List<Employee> employees = mapper.selectByPageHelper();
        employees.forEach(System.out::println);

        System.out.println(page.count(true));
        System.out.println(page.getEndRow());
        System.out.println(page.getTotal());
        System.out.println(page.getPages());
        System.out.println(page.getPageSize());

        System.out.println("pageinfo....");
        //默认显示3页index
        PageInfo<Employee> pageInfo = new PageInfo(employees,3);
        System.out.println(pageInfo.getNavigateFirstPage());
        System.out.println(pageInfo.getNextPage());
        System.out.println(pageInfo.getPages());
        System.out.println(pageInfo.getPageSize());
        System.out.println(pageInfo.getTotal());
        System.out.println("显示的页数index:");

        int[] navigatepageNums = pageInfo.getNavigatepageNums();
        for (int num : navigatepageNums) {
            System.out.println(num);
        }
    }

    private static void insertBatch(EmployeeMapper mapper) {

        long start = System.currentTimeMillis();
        ArrayList<Employee> arrayList = new ArrayList();
        for (int i = 0; i <100000; i++) {
             Employee dept=new Employee(UUID.randomUUID().toString().substring(1,6), "qwe", "0");
                mapper.insertBatch(dept);
//            if(i%500==0){
//                mapper.insertBatch(arrayList);
//                arrayList.clear();
//            }
        }
        System.out.println(System.currentTimeMillis() - start);
    }
}
